#include <iostream>
#include <vector>
#include <cstdint>
#include <stdexcept>

static constexpr size_t FRAME_SIZE = 32 * 1024; // 32KB
static constexpr size_t BUFFER_SIZE = 2 * FRAME_SIZE;
static constexpr size_t DEFAULT_MAX_FRAMES = 2; // 默认最大缓存帧数

class FrameQueueBuffer {
public:    

    FrameQueueBuffer(size_t maxFrames = DEFAULT_MAX_FRAMES, size_t frameSize = FRAME_SIZE,size_t bufSize = 0);

    // 写入一帧数据
    void writeFrame(const uint8_t* frameData, size_t frameSize);

    // 读取数据
    size_t read(uint8_t* data, size_t size, size_t offset);

    // 清空缓冲区
    void clear_data();

    // 获取当前有效数据的总长度
    size_t getValidDataLength() const;

private:
    size_t mFrameSize;
    size_t mBufferSize;
    size_t mMaxFrames; // 最大缓存帧数
    std::vector<uint8_t> buffer; // 缓冲区
    size_t writeIndex; // 写入索引
    size_t readIndex;  // 读取索引
    size_t frameCount; // 当前帧数
};

//int main() {
//    FrameQueueBuffer fb;
//
//    // 生成示例数据
//    std::vector<uint8_t> frame0(FrameQueueBuffer::FRAME_SIZE, 0x01);
//    std::vector<uint8_t> frame1(FrameQueueBuffer::FRAME_SIZE, 0x02);
//    std::vector<uint8_t> frame2(FrameQueueBuffer::FRAME_SIZE, 0x03);
//
//    // 写入三帧数据
//    fb.writeFrame(frame0.data(), FrameQueueBuffer::FRAME_SIZE);
//    fb.writeFrame(frame1.data(), FrameQueueBuffer::FRAME_SIZE);
//    fb.writeFrame(frame2.data(), FrameQueueBuffer::FRAME_SIZE);
//
//    // 打印当前有效数据长度
//    std::cout << "Current valid data length: " << fb.getValidDataLength() << " bytes" << std::endl;
//
//    // 读取数据
//    std::vector<uint8_t> readData(FrameQueueBuffer::FRAME_SIZE, 0x00);
//    size_t bytesRead = fb.read(readData.data(), FrameQueueBuffer::FRAME_SIZE, 1);
//
//    // 打印读取的数据
//    for (size_t i = 0; i < bytesRead; ++i) {
//        std::cout << std::hex << static_cast<int>(readData[i]) << " ";
//        if ((i + 1) % 16 == 0) {
//            std::cout << std::endl;
//        }
//    }
//
//    // 从第二帧的中间位置读取数据
//    bytesRead = fb.read(readData.data(), FrameQueueBuffer::FRAME_SIZE, FrameQueueBuffer::FRAME_SIZE);
//
//    // 打印读取的数据
//    for (size_t i = 0; i < bytesRead; ++i) {
//        std::cout << std::hex << static_cast<int>(readData[i]) << " ";
//        if ((i + 1) % 16 == 0) {
//            std::cout << std::endl;
//        }
//    }
//
//    // 清空缓冲区
//    fb.clear();
//
//    // 打印当前有效数据长度
//    std::cout << "Current valid data length after clear: " << fb.getValidDataLength() << " bytes" << std::endl;
//
//    // 再次读取数据（应该为空）
//    bytesRead = fb.read(readData.data(), FrameQueueBuffer::FRAME_SIZE, 0);
//
//    // 打印读取的数据
//    for (size_t i = 0; i < bytesRead; ++i) {
//        std::cout << std::hex << static_cast<int>(readData[i]) << " ";
//        if ((i + 1) % 16 == 0) {
//            std::cout << std::endl;
//        }
//    }
//
//    return 0;
//}